package com.design.mode.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @ClassName BuyAspect
 * @Description   面向切面编程   不修改原有的代码情况下   修改了代码的执行结果  无侵入式的改变原来的需求 这就是AOP 的神奇之处
 *
 *
 *  AOP的切入点有
 *  before 通知方法在目标方法之前执行
 *  After  通知方法在目标方法之后执行
 *  AfterReturning 通知方法在目标方法执行返回之后
 *  AfterThrowing  通知方法在目标方法抛出异常执行
 *  Around  通知方法在目标方法封装起来
 * @Author xiongchao
 * @Date 2020/10/10 14:02
 **/
@Aspect
@Component
public class BuyAspect {

    /*
     手动切入  在执行buy方法之前  执行改加强方法
     */
    @Before("execution(* com.design.mode.aop.IBuy.buy(..))")
    public void add(){
        System.out.println("男孩女孩都买到了自己想要的东西");
    }

    /*
     根据条件 匹配指定的类  执行切入的方法   指定切入实例名称为boy的类

     */
    //@Before("execution(* com.design.mode.aop.IBuy.buy(..)) && within(com.design.mode.aop.*) && bean(boy)")
    public void hehe(){
        System.out.println("男孩女孩都买到了自己想要的东西");
    }

    @After("execution(* com.design.mode.aop.IBuy.buy(..))")
    public void after(){
        System.out.println("after methods");
    }
    @AfterReturning("execution(* com.design.mode.aop.IBuy.buy(..))")
    public void afterreturning(){
        System.out.println("after return methods");
    }
    @Around("execution(* com.design.mode.aop.IBuy.buy(..))")
    public void around(ProceedingJoinPoint proceedingJoinPoint){
        try {
            System.out.println("around start");
            proceedingJoinPoint.proceed();
            System.out.println("around end");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }
}
